package com.ztesoft.sca.service;

import com.ztesoft.sca.dao.ImMenuManageDao;
import com.ztesoft.sca.model.ImButtonDto;
import com.ztesoft.sca.model.ImMenuDto;
import com.ztesoft.sca.model.ImPageDto;
import com.ztesoft.sca.util.seq.SequenceCreator;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 菜单管理接口
 *
 * @author guojd
 */
@Component
public class ImMenuManageServiceImpl implements ImMenuManageService {
    @Autowired
    ImMenuManageDao imMenuManageDao;

    /**
     * 新增菜单ID
     */
    @Override
    public Long getNewMenuId() {
        try {
            return SequenceCreator.getSequence("IM_MENU_SEQ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1L;
    }

    /**
     * 新增页面ID
     */
    @Override
    public Long getNewPageId() {
        try {
            return SequenceCreator.getSequence("IM_PAGE_SEQ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return -1L;
    }

    /**
     * 新增菜单
     *
     * @param imMenuDto 菜单对象
     */
    @Override
    public void insertMenu(ImMenuDto imMenuDto) {
        imMenuManageDao.insertMenu(imMenuDto);
    }

    /**
     * 删除菜单
     *
     * @param menuId 菜单ID
     */
    @Override
    public void deleteMenu(Long menuId) {
        imMenuManageDao.deleteMenu(menuId);
    }

    /**
     * 修改菜单
     *
     * @param imMenuDto 菜单对象
     */
    @Override
    public void updateMenu(ImMenuDto imMenuDto) {
        imMenuManageDao.updateMenu(imMenuDto);
    }

    /**
     * 查询菜单
     *
     * @param param 查询参数
     *              menuName/menuId/parentId/menuCode
     * @return 菜单列表
     */
    @Override
    public List<ImMenuDto> selectMenus(Map<String, Object> param) {
        return imMenuManageDao.selectMenus(param);
    }

    /**
     * 菜单列表树形
     *
     * @param parentId 父级ID，如果为空则查询全部
     * @return 菜单列表
     */
    @Override
    public List<ImMenuDto> selectMenuTree(Long parentId) {
        return generateMenuTree(parentId, imMenuManageDao.selectMenuTree(parentId));
    }

    /**
     * 将树形列表转换成树形结构
     *
     * @param rootNodeId    根节点
     * @param imMenuDtoList 树形列表
     * @return 树形结构
     */
    private List<ImMenuDto> generateMenuTree(Long rootNodeId, List<ImMenuDto> imMenuDtoList) {
        Map<Long, List<ImMenuDto>> menuTreeMap = new HashMap<>();
        List<ImMenuDto> imMenuDtoTreeList = new ArrayList<>();
        List<ImMenuDto> tmpSubMenuList;
        for (ImMenuDto imMenuDto : imMenuDtoList) {
            //判断是否查询根节点，如果是添加到根节点列表中
            boolean isRootNode = (rootNodeId == null && imMenuDto.getParentId() == null) || imMenuDto.getParentId().equals(rootNodeId);
            if (isRootNode) {
                imMenuDtoTreeList.add(imMenuDto);
            }
            //将对象挂到父级节点下
            if (!menuTreeMap.containsKey(imMenuDto.getParentId())) {
                tmpSubMenuList = new ArrayList<>();
                menuTreeMap.put(imMenuDto.getParentId(), tmpSubMenuList);
            } else {
                tmpSubMenuList = menuTreeMap.get(imMenuDto.getParentId());
            }
            tmpSubMenuList.add(imMenuDto);
        }
        //查找子节点
        for (ImMenuDto imMenuDto : imMenuDtoTreeList) {
            generateMenuTreeSub(imMenuDto, menuTreeMap);
        }
        return imMenuDtoTreeList;
    }

    /**
     * 递归查询子节点
     *
     * @param imMenuDto   当前节点
     * @param menuTreeMap 子节点列表map
     */
    private void generateMenuTreeSub(ImMenuDto imMenuDto, Map<Long, List<ImMenuDto>> menuTreeMap) {
        List<ImMenuDto> tmpSubMenuList = menuTreeMap.get(imMenuDto.getMenuId());
        if (tmpSubMenuList != null && tmpSubMenuList.size() > 0) {
            imMenuDto.setParents(true);
            imMenuDto.setSubMenu(tmpSubMenuList);
            for (ImMenuDto imMenuDto1 : tmpSubMenuList) {
                generateMenuTreeSub(imMenuDto1, menuTreeMap);
            }
        } else {
            imMenuDto.setParents(false);
            imMenuDto.setSubMenu(new ArrayList<>());
        }
    }

    /**
     * 根据菜单ID查询按钮
     *
     * @param menuId 菜单ID
     * @return 按钮列表
     */
    @Override
    public List<ImButtonDto> selectButtonsByMenuId(Long menuId) {
        return imMenuManageDao.selectButtonsByMenuId(menuId);
    }

    /**
     * 菜单按钮关系新增
     *
     * @param menuId   菜单ID
     * @param buttonId 按钮ID
     */
    @Override
    public void insertButtonMenuRela(Long menuId, Long buttonId) {
        imMenuManageDao.insertButtonMenuRela(menuId, buttonId);
    }

    /**
     * 删除菜单按钮关系
     *
     * @param menuId   菜单ID
     * @param buttonId 按钮ID
     */
    @Override
    public void deleteButtonMenuRela(Long menuId, Long buttonId) {
        imMenuManageDao.deleteButtonMenuRela(menuId, buttonId);
    }

    /**
     * 新增页面
     *
     * @param imPageDto 页面对象
     */
    @Override
    public void insertPage(ImPageDto imPageDto) {
        imMenuManageDao.insertPage(imPageDto);
    }

    /**
     * 删除页面
     *
     * @param pageId 页面ID
     */
    @Override
    public void deletePage(Long pageId) {
        imMenuManageDao.deletePage(pageId);
    }

    /**
     * 更新页面
     *
     * @param imPageDto 页面对象
     */
    @Override
    public void updatePage(ImPageDto imPageDto) {
        imMenuManageDao.updatePage(imPageDto);
    }

    /**
     * 查询页面列表
     *
     * @param param 参数
     *              pageId/menuId/pageCode/pageName/title/url
     * @return 页面列表
     */
    @Override
    public List<ImPageDto> selectPages(Map<String, Object> param) {
        return imMenuManageDao.selectPages(param);
    }
}
